package juego.movil;

import juego.tipos.*;
import juego.tipos.clasificacion.*;
import juego.motor.*;
import juego.Cielo;
import java.util.*;
import juego.interfaces.*;
import javax.swing.Timer;
import java.awt.event.*; // for ActionListener and ActionEvent

public abstract class ObjetoMovil implements Posicionable,ActionListener{
	
	protected Poder poder;
	protected Posicion posicion;
	protected int tamanio = 0;
	protected Motor motorMovimiento;
	//protected int puntosPorDestruccion = 0;
	//protected Timer timer;	


	public Posicion getPosicion(){
		return this.posicion.copiar();
	}	
	
	public int getTamanio(){
		return tamanio;
	}
	
	public Poder getPoder(){
		return poder.copiar();
	}
	
	public Clasificacion getClasificacion(){
		return new ClasificacionNeutral();
	}

	public void setMotor(Motor nuevoMotor){
		motorMovimiento = nuevoMotor;
	}

	public void setPoder(Poder nuevoPoder){
		poder = nuevoPoder.copiar();
	}

	public void setPosicion(Posicion nuevaPosicion){
		posicion = nuevaPosicion.copiar();
	}
	
	public void setTamanio(int nuevoTamanio){
		tamanio = nuevoTamanio;
	}
	
/********************************/	
	public ObjetoMovil copiar(){
		return this;
	}

	public double dist(Posicionable otro){
		return this.posicion.dist(otro.getPosicion());
	}

	//Reponde si choca o no con otro objeto analizando su clasificacion
	//y la distancia entre ambos
	public boolean chocaCon(ObjetoMovil otroObjeto){
		if(this.getClasificacion().enfrentaA(otroObjeto.getClasificacion())){
			return (this.dist(otroObjeto) < (this.tamanio + otroObjeto.getTamanio()));
		}
		return false;
	}

	public void chocar(ObjetoMovil objetoContraElQueChoca){
		
		poder.enfrentar(objetoContraElQueChoca.getPoder());
		if(poder.agotado()){
			this.detenerVida();
			//cielo quitar: self.
		//(cielo getJugador)sumarPuntos: puntosPorDestruccion..].
		}
	}

	public void mover(){}

	/*Determina si el receptor esta en poscion de choque con otro objeto del cielo,
	y de ser asi, ejecuta la logica del choque*/
	public void analizarEntorno(){
		boolean noChoco = true;
		ObjetoMovil otro;
		Cielo cielo = Cielo.getInstancia();
		List<ObjetoMovil> entorno = cielo.getListaElementos();
		Iterator i = entorno.iterator();
		//Mientras no murio
		while(noChoco && i.hasNext()){
			otro = (ObjetoMovil) i.next();
			if(this.chocaCon(otro)){
				ObjetoMovil aux = this.copiar();
				this.chocar(otro);
				otro.chocar(aux);
				noChoco = false;
			}
		}
	
	}
	/*******************************************************************/
	
	//public ObjetoMovil(Posicion posicionInicial){
	//}

	public ObjetoMovil(){}
	
	public void actuar(){
		this.mover();
		this.analizarEntorno();
	}

	/*Al parecer no vamos a usar el timer.*/
	//Inicia un timer que hara que el objeto actue cada sierto tiempoEnMilisegundos.
	public void iniciarVida(int tiempoEnMilisegundos){
		/*timer = new Timer (tiempoEnMilisegundos, this);//Setea como objeto a controlar al objeto actual(que es un ActionListener)
		timer.setRepeats(true);
		timer.start();*/
	}

	public void detenerVida(){
		/*timer.stop();
		timer = null;*/
	}
	
	
	//Metodo al cual llama el Timer.
	public void actionPerformed(ActionEvent e){
		this.actuar();
	}
}
